package org.example.ItemCF.src.recommend;


import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * Mapper类：将原始用户-项目-偏好数据转换为用户-项目向量格式。
 */
public class Step1ToItemPreMapper extends Mapper<Object, Text, IntWritable, Text> {
    // 定义并初始化常量k，为IntWritable类型，用于存储整数值
    private final static IntWritable k = new IntWritable();
    // 定义并初始化常量v，为Text类型，用于存储文本数据
    private final static Text v = new Text();


    /**
     * 对输入的每行数据进行处理，将其转换为用户-项目向量的格式。
     * 此方法是MapReduce框架中的map函数，用于对输入数据进行初步处理，生成中间键值对。
     *
     * @param key 输入行的键，对于输入的每行数据，键通常代表某种标识符。
     * @param value 输入行的值，对应输入数据的具体内容。
     * @param context 上下文对象，用于输出处理后的键值对到下一阶段的处理。
     * @throws IOException 当读取或写入发生错误时抛出。
     * @throws InterruptedException 当执行被中断时抛出。
     */
    @Override
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        // 解析输入数据，将每行数据按预定义分隔符拆分成用户ID、项目ID和偏好程度
        String[] tokens = Recommend.DELIMITER.split(value.toString());
        int userID = Integer.parseInt(tokens[0]);
        String itemID = tokens[1];
        String pref = tokens[2];

        // 设置输出键值对，将用户ID作为键，项目ID和偏好程度拼接成字符串作为值
        k.set(userID);
        v.set(itemID + ":" + pref);
        context.write(k, v); // 输出中间键值对，为后续的reduce操作做准备
    }

}
   
